/*=============================================================================

  AREA UTILITY MODULE

  FILE: area_fg.cpp
  
  DESCRIPTION

    TMIP UTILITY MODULE
    
  EXTERNALIZED FUNCTIONS

    
  Copyright (c) DaeSung Engineering Inc. All rights reserved.

=============================================================================*/
/*=============================================================================

                             EDIT HISTORY

  ---------  -------  -------------------------------------------------------
    when       who     what, where, why
  ---------  -------  -------------------------------------------------------
   05/26/05   pkim    Version E01.0

=============================================================================*/

/*=============================================================================
  HEADER INCLUSION
=============================================================================*/
#include <area_mod.h>
#include <Vmain.h>
#include <mainView.h>

/*=============================================================================
  CONSTANT DEFINITION
=============================================================================*/

/*=============================================================================
  EXTERNALIZED FUNCTION DEFINITION
=============================================================================*/
static void fg_logCB(area_s *cxt, Img2D o);
static void fg_read(area_s *cxt, Img2D o);

boolean area_fgCB(mcxt app, Img2D o)
{
	area_s			*cxt = AREACXT(app);

	if(cxt == NULL)
		return	FALSE;

	if(o == NULL)
		return	FALSE;

	switch(cxt->mode)
	{
	case AREA_AUTO_M:
	case AREA_MANUAL_M:
	{
		fg_logCB(cxt, o);
		break;
	}
	case AREA_READ_M:
	default:
	{
		fg_read(cxt, o);
		break;
	}
	}
	return	TRUE;
}

/*=============================================================================
  LOG.FG
=============================================================================*/
void fg_logCB(area_s *cxt, Img2D o)
{
	area_acq_s			*acq;

	acq = area_ACQalloc();
	acq->acqID = cxt->cntLOG;
	acq->o = imcopy(o);

LLIST_ENTER(cxt->que);
	LList_InsertTail(cxt->que, (void*)acq);
LLIST_LEAVE(cxt->que);

	cxt->cntLOG++;

	if(Task_PutSignal(cxt->task, AREA_TASK_SIG) == FALSE)
	{
		return;
	}
}

void fg_read(area_s *cxt, Img2D o)
{
	Vmain			*vm = (Vmain*)ObjList_Get(VIEW_VMAIN);
	Vmanual			*vn = (Vmanual*)ObjList_Get(VIEW_VMANUAL);
	GImgVw			*gi;
	dword			vwCur;

	if((vm == NULL) || (vn == NULL))
		return;

	vwCur = UIprm_Get(UI_VWCURRENT_P, 0, 0);

	if(vwCur == UI_MAIN_VW)
	{
		gi = (GImgVw*)vm->IMGget();
	}
	else
	{
		gi = (GImgVw*)vn->IMG_GET();
	}

	if(gi == NULL)
		return;

	//---IMAGE.COPY
	switch(imtype(o))
	{
	case IMG_TYPE_BIT24_3CHAN:
	{
		Img2D		c0, c1, c2;

		if(im3chan(o, &c0, &c1, &c2) == TRUE)
		{
			if(cxt->img)
			{
				imcopy_mem(o, cxt->img);
			}
			else
			{
				cxt->img = imcopy(o);
			}
			IMP_FREE(c0);
			IMP_FREE(c1);
			IMP_FREE(c2);
		}
		else
		{
			return;
		}
		break;
	}
	case IMG_TYPE_BIT8:
	{
		if(cxt->img)
		{
			imcopy_mem(o, cxt->img);
		}
		else
		{
			cxt->img = imcopy(o);
		}
		break;
	}
	default:
		return;
	}

	if(gi)
	{
		gi->SetImage(o);
		gi->FLUSH();
	}
}

Img2D area_READget(mcxt app)
{
	area_s			*cxt = AREACXT(app);

	if(cxt == NULL)
		return NULL;
	
	if(cxt->mode == AREA_READ_M)
		return NULL;
	
	return cxt->img;
}

// For simulation mode only
void area_READset(mcxt app, Img2D o)
{
	area_s			*cxt = AREACXT(app);

	if(cxt == NULL)
		return;

	if(o == NULL)
		return;

	cxt->img = imcopy(o);
}

boolean area_READclear(mcxt app)
{
	area_s			*cxt = AREACXT(app);

	if(cxt == NULL)
		return	FALSE;

	if(cxt->img == NULL)
		return	TRUE;

	IMP_FREE(cxt->img);
	cxt->img = NULL;

	return	TRUE;
}

/*--- END OF area_fg.cpp ---*/
